最长优雅子数组(Leetcode 2401)

1

题目分析

   本题是周赛的第三题,我感觉比第二题简单。本周的双周赛最后一题就是双指针,这又来了一题双指针,希望小伙伴们可以好好掌握双指针的解题模板。

双指针

子数组内每对元素按位与都是0,说明子数组内所有元素相与也是0。

因此我们每次将左指针移动一个距离,然后去寻找最右边符合条件的索引。

和双周赛最后一题的区别是,那道题是右指针移动一个距离,寻找最左边的索引。当然两种方法都可以,只不过可能存在一种好写另一种复杂的情况。

双周赛那道题,如果左边移动,右边寻找时,如果右边加入队列后,计算不满足条件需要出队列,因此很麻烦。

本题如果右边移动,左边寻找,因为右边不满足条件不能移动,所以本题只能左边移动。寻找满足条件的最右边。

算法的时间复杂度为$ O(n) $,空间复杂度为O(1)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public int longestNiceSubarray(int[] nums) {
int current = 0;
int n = nums.length;
int res = 0;
for (int left = 0, right = 0; right < n; left++) {
while (right < n && (current & nums[right]) == 0) {
current |= nums[right++];
}
res = Math.max(res, right - left);
if (right == n) {
return res;
}
current ^= nums[left];
}
return res;
}
}

刷题总结

  双指针的题目有一定的模板,一般是一个指针每次移动一步,另一个指针寻找最端点的位置。要不是左指针每次移动一个元素,寻找满足条件的右指针的索引(下一个索引不满足)。要不就是右指针每次移动一个元素,寻找满足条件的左指针的索引(上一个索引不满足)。

-------------本文结束感谢您的阅读-------------
0%